# 7、统计一个整数对应的二进制数的1的个数。
# 输入一个整数（可正可负，负数就按64位去遍历即可）， 输出该整数的二进制包含1的个数（使用位运算）

"""
当一个负数被转换为二进制时，它会占用固定的位数（通常是32位或64位），即使原始负数的二进制表示中前导位都是1。
在这种情况下，我们需要对负数进行处理，以便将其视为64位二进制数。
通过将负数与0xFFFFFFFFFFFFFFFF进行按位与运算，可以将负数转换为64位二进制数，
因为0xFFFFFFFFFFFFFFFF 是十六进制表示的64位二进制数，所有位都是1
"""


def count_ones(num):
    count = 0
    if num < 0:
        num = num & 0xFFFFFFFFFFFFFFFF  # 负数按64位去遍历
    while num:
        count += 1
        num = num & (num - 1)  # 按位与是在二进制下进行，哪怕这里我们看到的是十进制数
        # num - 1会将num中的最低位的1变为0，同时将低于该位的所有位取反。比如00011000变为00010111
        # num & (num - 1)进行按位与操作，将num中的最低位的1置零，而其他位保持不变。
        # 00011000 & 00010111 = 00010000。即最低位的1变为0。这样从低到高依次让1变为0，也就统计了1的个数
    return count


# 输入一个整数
num = int(input("请输入一个整数："))
# 统计二进制中1的个数
ones_count = count_ones(num)
print(f"整数 {num} 的二进制表示中包含 {ones_count} 个1")
